<?php
/**
 * 轮询：每个客户端一次均匀分配队列消息
 * 使用方式：打开多个终端, php worker_lunxun.php, 等待接收消息； 然后 php pub.php
 */
require __DIR__ . '/../../vendor/autoload.php';
require __DIR__ . '/../Mqtt.php';

$mqtt = new Mqtt;
$mqtt->createChannel();

$queueName = "mqtt_worker";

/*
创建一个队列：
    @param queueName 队列名称，
    @param passive 设置为true表示：如果存在这个队列则返回队列的信息 ，如果不存在这个队列则抛异常
    @param durable 是否持久化（重启后队列还存在） 
    @param exclusive 是否独占队列，该队列仅对首次声明它的连接可见，并在连接断开时自动删除
    @param auto_delete 所有消费断开连接后是否自动删除队列
    @param nowait = false 不等待处理结果
*/
$mqtt->createQueue($queueName, false, true, false, false);

/**
 * 只有consumer已经处理并确认了上一条message时queue才分派新的message给它，
 * RabbitMQ就会把消息分发给下一个空闲的工作者（worker）
 * @param int  $prefetch_size //未实现
 * @param int  $prefetch_count=N //告诉RabbitMQ不要同时给一个消费者推送多于N个消息,一旦有N个消息还没ack,则不在分派新消息给它
 * @param bool $a_global  //未实现
 */
$mqtt->setQos(1);

/**
 * @param $queue = '', //队列名称
 * @param $consumer_tag = '', //消费者标签
 * @param $no_local = false, //属于AMQP的标准,但是rabbitMQ并没有做实现.
 * @param $no_ack = false, //false表示收到消息后需要回复确认才被认为被消费
 * @param $exclusive = false, //true表示：这个队列只能由一个消费者消费
 * @param $nowait = false, //true表示不需等待执行结果
 * @param $callback = null, //回调
 */
$mqtt->consumeMsg(function($msg){
    echo $msg . PHP_EOL;
}, '', false, true, false, false);

$mqtt->close();
